package A2018;


/*
请你计算：依照科学家的预测，照片中有多少岛屿会被完全淹没。
【输入格式】
第一行包含一个整数N。 (1 <= N <= 1000)
以下N行N列代表一张海域照片。
照片保证第1行、第1列、第N行、第N列的像素都是海洋。
【输出格式】
一个整数表示答案。
【输入样例】
8
........
.###..#.
.###..#.
.#####..
...###..
...###..
.#......
........
【输出样例】
1
资源约定：
峰值内存消耗（含虚拟机） < 256M
CPU消耗 < 1000ms
 */
import java.util.Scanner;
public class _8_全球变暖 {//正确
	static char[][] s = new char[1002][1002];;
	public static void main(String[] args) {
		int i, n, j, ans = 0, sum = 0;
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		sc.nextLine();
		for (i = 1; i <=n; i++) {
			String str = "."+sc.nextLine();
			s[i] = str.toCharArray();
		}
		for (i = 1; i <= n; i++)// 找寻多少块岛屿；
			for (j = 1; j <= n; j++)
				if (s[i][j] == '#') {
					zx(i, j); // 将同一块岛屿 标记防重复
					ans++;
				}
		for (i = 1; i <= n; i++)// 找寻那些块岛屿不会被淹；
			for (j = 1; j <= n; j++)
				if (s[i][j] >= '4' && s[i][j] <= '9') {
					s[i - 1][j] += 1;
					s[i + 1][j] += 1;
					s[i][j - 1] += 1;
					s[i][j + 1] += 1;
				}
		for (i = 1; i <= n; i++)// 找寻剩多少块岛屿；
			for (j = 1; j <= n; j++)
				if (s[i][j] == '8') {
					zx2(i, j); // 将同一块岛屿 标记防重复
					sum++;
				}
		System.out.println(ans - sum);
	}

	static void zx(int x, int y) {
		if (s[x][y] != '#')
			return;
		s[x][y] = '4';
		zx(x + 1, y);
		zx(x - 1, y);
		zx(x, y - 1);
		zx(x, y + 1);

	}
	static void zx2(int x, int y) {
		if (s[x][y] >= '4' && s[x][y] <= '9')
		// 为岛屿则全部淹没（不管这个大岛最后有多少小岛出来）
		{
			s[x][y] = '*';
			zx2(x + 1, y);
			zx2(x - 1, y);
			zx2(x, y - 1);
			zx2(x, y + 1);
		}
		return;
	}

}
